package br.sc.senai.model.resource;

import java.lang.reflect.Field;

import br.sc.senai.model.exception.GenericException;

public class SqlQueryUtil {

	/**
     * @author jefferson
     * Será criado um sql padrão para ser formatado com os valores passados no EntitiesDAO.
     * 
     * */
	public static String createInsert(Class pClass) throws GenericException{
        try {
            String mSQL = "insert into %s \n (%s) \n values (%s) \n";
            StringBuilder mStrCampos = new StringBuilder();
            StringBuilder mStrValues = new StringBuilder();
                        
            for (Field f : pClass.getDeclaredFields()) {
            	mStrCampos.append(String.format("%s ", f.getName()));
            	mStrValues.append("*s ");
			}
            
            return String.format(mSQL,
            		pClass.getSimpleName(),
            		mStrCampos.toString().trim().replace(' ', ','),
            		mStrValues.toString().trim().replace(' ', ',').replace('*', '%'));
        } catch (Exception e) {
            throw new GenericException(String.format(Mensagens.ERRO_INESPERADO, "Criar sql padrão"), e);
        }
    }
    
	/**
     * @author jefferson
     * Será criado um sql padrão para ser formatado com os valores passados no EntitiesDAO.
     * 
     * */
    public static String createUpdate(Class pClass, String... pCamposCondicao) throws GenericException{
        try {
        	String mSQL = "update %s \n set %s \n where 1=1 %s";
            StringBuilder mStrFieldsUpdate = new StringBuilder();
            StringBuilder mStrFieldsFilter = new StringBuilder();
                        
            for (Field f : pClass.getDeclaredFields()) {
            	mStrFieldsUpdate.append(String.format("\n\t%s=*s ", f.getName()));
			}
            
            for (String str : pCamposCondicao) {
            	mStrFieldsFilter.append(String.format("and\t%s=*s ", str));
			}
            
            return String.format(mSQL,
            		pClass.getSimpleName(),
            		mStrFieldsUpdate.toString().trim().replace(' ', ',').replace('*', '%'),
            		mStrFieldsFilter.toString().trim().replace(' ', ',').replace('*', '%'));
        } catch (Exception e) {
        	throw new GenericException(String.format(Mensagens.ERRO_INESPERADO, "Criar sql padrão"), e);
        }
    }
    
    /**
     * @author jefferson
     * Será criado um sql padrão para ser formatado com os valores passados no EntitiesDAO.
     * 
     * @param pCampos
     * <p>
     * Descrever quais campos serão usados na condição, passar o parâmetro da mesma forma que é feito
     * no métod "format" da classe "String".
     * Note no exemplo que podem ser usagos quantos campos forem necessários para criar o sql.
     * </p> 
     * <p>
     * ex: createDelete(Carro.class, "campo1", "campo2", "campo3").
     * </p>
     * */
    public static String createDelete(Class pClass, String... pCampos) throws GenericException{
        try {
            String mSQL = "delete from %s where 1=1 %s";
            StringBuilder mCondicoes = new StringBuilder();
            
            for (String nomeColuna : pCampos) {
				mCondicoes.append(String.format("\n and %s=*s", nomeColuna));
			}            
            
            return String.format(mSQL,
            		pClass.getSimpleName(),
            		mCondicoes.toString().replace('*', '%'));
        } catch (Exception e) {
        	throw new GenericException(String.format(Mensagens.ERRO_INESPERADO, "Criar sql padrão"), e);
        }
    }
    
    /**
     * @author jefferson
     * Será criado um sql padrão para ser formatado com os valores passados no EntitiesDAO.
     * 
     * @param pCampos
     * <p>
     * Descrever quais campos serão usados na condição, passar o parâmetro da mesma forma que é feito
     * no métod "format" da classe "String".
     * Note no exemplo que podem ser usagos quantos campos forem necessários para criar o sql.
     * </p> 
     * <p>
     * ex: createDelete(Carro.class, "campo1", "campo2", "campo3").
     * </p>
     * */
    public static String createSelect(Class pClass,  String... pCampos) throws GenericException{
        try {
        	String mSQL = "select * from %s where 1=1 %s";
            StringBuilder mCondicoes = new StringBuilder();
            
            for (String nomeColuna : pCampos) {
				mCondicoes.append(String.format("\n and %s=*s", nomeColuna));
			}            
            
            return String.format(mSQL,
            		pClass.getSimpleName(),
            		mCondicoes.toString().replace('*', '%'));
        } catch (Exception e) {
        	throw new GenericException(String.format(Mensagens.ERRO_INESPERADO, "Criar sql padrão"), e);
        }
    }
}
